perm filename PURGE.SAI[VV,BGB] blob sn#127028 filedate 1974-12-06 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00010 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	BEGIN "PURGE"
C00005 00003	⊃	This is the magic macro which defines good files
C00008 00004			⊃ CAMERA CALIBRATION
C00011 00005		ZZ(TOWER,NUL),		⊃	TOWER OF HANOI PROGRAMS
C00015 00006		⊃	AJT FILES
C00018 00007	⊃	Now we use the magic macro to generate our tables
C00020 00008	⊃	This routine types the commands
C00022 00009	⊃	This routine outputs the illegal file names.
C00025 00010	⊃	Now we get down to business
C00027 ENDMK
C⊗;
BEGIN "PURGE"
LET DEFINE=REDEFINE;
STRING ARRAY UFD_FILE, UFD_EXT[1:1000];
INTEGER UFDLENGTH;
DEFINE DSK="1", LPT="2", CRLF="('15&'12)", ⊃="COMMENT";

⊃	make CVXSTR honest;

SIMPLE STRING PROCEDURE CVXX(INTEGER VAL);
	BEGIN STRING FOO;
	INTEGER I;
	FOO ← CVXSTR(VAL);
	FOR I ← LENGTH(FOO) STEP -1 UNTIL 1 DO IF FOO[I FOR 1]≠" " THEN DONE;
	RETURN(IF I THEN FOO[1 FOR I] ELSE "");
	END;

⊃	read ufd file;

SIMPLE PROCEDURE UFDREAD;
	BEGIN INTEGER EOF, SIXBIT, FLAG;
	OPEN(DSK,"DSK",8,2,0,128,EOF,EOF);
	LOOKUP(DSK,"SYS HE.UFD[1,1]",FLAG);
	IF FLAG THEN USERERR(0,0,"UFD LOOKUP ERROR");
	UFDLENGTH ← 0;
	WHILE TRUE DO
		BEGIN
		SIXBIT ← WORDIN(DSK);
		IF EOF THEN DONE;
		IF SIXBIT THEN
			BEGIN
			UFD_FILE[UFDLENGTH←UFDLENGTH+1] ← CVXX(SIXBIT);
			UFD_EXT[UFDLENGTH] ← CVXX(WORDIN(DSK) LAND
				'777777000000);
			END ELSE WORDIN(DSK);
		WORDIN(DSK);
		WORDIN(DSK);
		END;
	CLOSE(DSK);
	END;

DEFINE EXT_LENGTH="25";
PRELOAD_WITH "SAI","FAI","MAC","F4","REL","DMP","","LST","WRU",
	"PUB","FND","TRP","DAT","???","TXT","HDR","SEG","LNK","RUN","AUX",
	"DOC","CMD","GUN","HAL","TRJ","YEL";
SAFE STRING ARRAY COMMON_EXT[0:EXT_LENGTH];
DEFINE SAI="1", FAI="2", MAC="4", F4="'10", REL="'20", DMP="'40", NUL="'100",
	LST="'200",WRU="'400",PUB="'1000",FND="'2000",TRP="'4000",
	DAT="'10000",CAL="'20000",TXT="'40000",HDR="'100000",SEG="'200000",
	LNK="'400000",RUN="'1000000",AUX="'2000000",DOC="'4000000",
	CMD="'10000000",GUN="'20000000",HAL="'40000000",TRJ="'100000000",
	YEL="'200000000", BIT(I,A)="MORE_EXT[I] LAND A";
DEFINE NULLIND="6"; ⊃	INDEX OF NULL EXT.;
⊃	This is the magic macro which defines good files;

DEFINE XX="
	⊃		KKP FILES;

		⊃ EDGE FOLLOWER;

	ZZ(DD,FAI+REL),		⊃	DUMMY RAID TO FORCE SYMBOLS;
	ZZ(INNER,SAI+REL),	⊃	EDGE FOLLOWER INSIDE EDGE SCANNER;
	ZZ(EDGE,SAI+REL+DMP),	⊃	EDGE FOLLOWER MAIN PROGRAM;
	ZZ(MISEDG,SAI+REL),	⊃	EDGE FOLLOWER UTILITY ROUTINES;
	ZZ(CONTRL,SAI+REL),	⊃	EDGE FOLLOWER CONTROL PROGRAM;
	ZZ(SCANER,SAI+REL),	⊃	EDGE FOLLOWER ACCOMODATION ROUTINES;

		⊃ CURVE FITTER;

	ZZ(CURVE,SAI+REL+DMP),	⊃	CURVE FITTER MAIN PROGRAM;
	ZZ(MISCUR,SAI+REL),	⊃	CURVE FITTER UTILITY PROGRAMS;
	ZZ(CURFAI,FAI+REL),	⊃	CURVE FITTER FAIL ROUTINES;

		⊃ HAND/EYE MONITOR;

	ZZ(HE,SAI),		⊃	HAND/EYE MONITOR (DUMP ON [1,3]);
	ZZ(HEINIT,FAI+REL),	⊃	FAIL CODE FOR HE;
	ZZ(DOHE,NUL),		⊃	COMPILES, LOADS, AND SAVES HE ON SYS;

		⊃ OBJECT SEGMENTER - BY G. GRAPE;

	ZZ(PROTO,GUN),		⊃	PROTOTYPE FILE FOR GUNLO;
	ZZ(GUNLO,SAI+REL+DMP),	⊃	SEGMENTER;
	ZZ(SAIDIS,SAI+REL),	⊃		DISPLAY PACKAGE;
	ZZ(SAVRES,SAI+REL),	⊃		FILE HANDLING;
	ZZ(SAISER,SAI+REL),	⊃		SERVICE;
	ZZ(FORSER,SAI+REL),	⊃		MORE SERVICE;
	ZZ(GUNFAI,FAI+REL),	⊃		FAIL SERVICE;
	ZZ(SCENE,SAI+REL),	⊃		CROSS REFERENCE;
	ZZ(LINE,SAI+REL),	⊃		LINE FITTING;
	ZZ(LINVER,SAI+REL),	⊃		LINE DATA STRUCT.;
	ZZ(PROT,SAI+REL),	⊃		PROTOTYPE STRUCT.;
	ZZ(MAPS1,SAI+REL),	⊃		PARSING;
	ZZ(MAPS2,SAI+REL),	⊃		MAPPING;
	ZZ(SUBRS,DOC),		⊃	SUBROUTINE LISTING AND XREF;
	ZZ(STRUCT,DOC),		⊃	DATA STRUCTURE DOCUMENTATION;
	ZZ(COMAND,DOC),		⊃	COMMAND DOCUMENTATION;

		⊃ UTILITY PACKAGE AND DRIVER - ON UDP;

⊃	ZZ(IIDRV,SAI+DMP+WRU),	⊃	NEW DRIVER FOR UTILITY PACKAGE;
⊃	ZZ(HEUTIL,SAI+WRU),	⊃	HAND/EYE UTILITY ROUTINES;
⊃	ZZ(RUNII,NUL),		⊃	DO FILE FOR RUNNING IIDRV;
⊃	ZZ(HEMACR,NUL),		⊃	MACROS FOR UTILITY ROUTINES;
		⊃ CAMERA CALIBRATION;

	ZZ(CAMERA,SAI+DMP+WRU),	⊃	CAMERA CALIBRATION PROGRAM;
	ZZ(SOBMAT,SAI+REL),	⊃	CAMERA UTILITY ROUTINES;
	ZZ(DATA,NUL),		⊃	CALIBRATION DATA FOR CAMERA;
	ZZ(DATA2,NUL),		⊃	CALIBRATION DATA FOR NEWCAM;

		⊃ EDGE VERIFIER;

	ZZ(VERIFY,SAI+DMP),	⊃	LINE VERIFIER;

	⊃	SHY FILES (OBS. ON UDP)

⊃	ZZ(OP1,MAC+REL),	⊃	SOBEL OPERATOR;
⊃	ZZ(AFD,SAI+DMP+LNK+RUN),⊃	DRIVER FOR FOCUS PROGRAM;
⊃	ZZ(GILFOC,SAI+DMP),	⊃	FOCUS PROGRAM;
⊃	ZZ(GILEYE,SAI+DMP),	⊃	CORNER FINDER PROGRAM;
⊃	ZZ(TVSER,SAI),		⊃	FILE COMMON TO AFD,GILFOC,GILEYE;
⊃	ZZ(STKDRV,SAI+DMP),	⊃	?????;
⊃	ZZ(CALDRV,SAI+DMP),	⊃	?????;
⊃	ZZ(HANDSE,SAI),		⊃	FILE COMMON TO STKDRV AND CALDRV;
⊃	ZZ(CAL,LNK+RUN),	⊃	RUN CONTROL FILES FOR CALDRV;
⊃	ZZ(STK,LNK+RUN),	⊃	RUN CONTROL FILES FOR STKDRV;
⊃	ZZ(NEWCAM,SAI+DMP),	⊃	NEW CAMERA CALIBRATION PROGRAM;

	⊃	TOB FILES replaced by AJT - ON UDP;

⊃	ZZ(COLOR,SAI+DMP),	⊃	COLOR RECOGNIZER;

	⊃	LOU FILES;

	ZZ(MATRIX,FAI+REL),	⊃	MATRIX ARITH. UTILITY ROUTINES;
	ZZ(VECT,FAI+REL),	⊃	VECTOR ARITH. UTILITY ROUTINES;
	ZZ(SAILIB,SAI+REL),	⊃	ARM UTILITY ROUTINES;
	ZZ(HANDY,SAI+DMP),	⊃	ARM CONTROL PROGRAM;
	ZZ(HANDB,SAI+DMP),	⊃	ARM CONTROL PROGRAM;
	ZZ(INTFAC,FAI+REL),
	ZZ(YELLOW,SAI+DAT),	⊃	ARM TESTING PROGRAM;
	ZZ(BLUE,SAI+DAT),	⊃	ARM TESTING PROGRAM;
	ZZ(WAVE,SAI),
	ZZ(MOVE,SAI+DMP),
	ZZ(MODEL,SAI+DMP),	⊃	MODEL BUILDER;
	ZZ(VECTOR,SAI),		⊃	VECTOR DECLARATIONS;
	ZZ(HASH06,FAI+REL),
	ZZ(UNDER,FAI+REL),	⊃	ARM UTILITY ROUTINES;
	ZZ(DRIVE,FAI+REL),	
	ZZ(YELO,DMP),
	ZZ(ARM,NUL),
	ZZ(ARMSOL,NUL),
	ZZ(TRAJ,SAI),
	ZZ(THROW,SAI),
	ZZ(TOWER,NUL),		⊃	TOWER OF HANOI PROGRAMS;
	ZZ(NLF,SAI+DMP+YEL+TRJ),
	ZZ(HANOI,NUL+HAL+TRJ),

	⊃	RPO FILES - ON UDP (OBSOLETE);

⊃	ZZ(SIMPLE,SAI+DMP),	⊃	SIMPLE BODY RECOGNIZER;
⊃	ZZ(SIMAUX,SAI),		⊃	REST OF SIMPLE;
⊃	ZZ(DPDP,F4+REL),	⊃	SIMPLE UTILITY ROUTINES;
⊃	ZZ(MODELS,TRP),		⊃	SIMPLE'S PROTOTYPES;

⊃	ZZ(COMPLX,NUL),		⊃	COMPLEX FILES;
⊃	ZZ(CPXSYM,AUX),
⊃	ZZ(RECOG,SAI+AUX+DMP+CMD),	⊃	RECOGNIZER;
⊃	ZZ(RECOG0,SAI),
⊃	ZZ(RECOG1,SAI),
⊃	ZZ(RECOG2,SAI),
⊃	ZZ(RECOG3,SAI),
⊃	ZZ(RECDPY,SAI+HDR),
⊃	ZZ(RECCOM,AUX),
⊃	ZZ(SEGMEN,SAI+AUX+DMP+CMD),	⊃	SEGMENTER;
⊃	ZZ(SEG0,SAI),
⊃	ZZ(SEG1,SAI),
⊃	ZZ(SEG2,SAI),
⊃	ZZ(SEGDPY,SAI+HDR),
⊃	ZZ(SEGCOM,AUX),
⊃	ZZ(PREDIC,SAI+AUX+DMP+CMD),	⊃	PREDICTOR;
⊃	ZZ(PRED0,SAI+FAI+AUX),
⊃	ZZ(PRED1,FAI),
⊃	ZZ(PRED2,FAI),
⊃	ZZ(PRED3,FAI),
⊃	ZZ(PRED4,FAI),
⊃	ZZ(PRED5,FAI),
⊃	ZZ(PRECOM,AUX),

	⊃	WAP FILES;

⊃	ZZ(WALDSK,SAI+DMP),
⊃	ZZ(WALEYE,SAI+DMP),
⊃	ZZ(WALDRV,SAI+DMP),
⊃	ZZ(WAL,CMD),
⊃	ZZ(WEC,CMD),
⊃	ZZ(LINE,FND),
⊃	ZZ(IMAGE,SAI),
	⊃	AJT FILES;

	ZZ(COLOUR,SAI+DMP),	⊃	NEW COLOUR PROGRAM;
	ZZ(PROTO,SAI),		⊃	DISPLAYS GUNNAR PROTO FILES;
⊃	ZZ(BLK0,DAT),		⊃	PICTURE FILES FOR STEREO;
⊃	ZZ(BLK1,DAT),
⊃	ZZ(BLK2,DAT),
⊃	ZZ(BLK3,DAT),

	⊃	GENERAL FILES maintained by KKP;

	ZZ(WHLTST,SAI+DMP),	⊃	COLOR WHEEL TEST PROGRAM;
	ZZ(DACTST,SAI+DMP),	⊃	DAC TEST PROGRAM;
	ZZ(SERTST,SAI+DMP),	⊃	TSERVO TEST PROGRAM;
	ZZ(TBLTST,SAI+DMP),	⊃	TURNTABLE TEST PROGRAM;
	ZZ(POTCAL,SAI),		⊃	POT CALIBRATION ROUTINE;
	ZZ(APPLY,SAI+DOC+DMP+PUB), ⊃ 	OPERATOR TESTING PROGRAM;
	ZZ(FLIST,SAI+DOC+DMP),	⊃	FILE LISTER ;
	ZZ(PREAMB,SAI+TXT),	⊃	GLOBAL MODEL DEFINITIONS;
	ZZ(EDGCUR,PUB+DOC),	⊃	EDGE FOLLOWER DOCUMENTATION;
	ZZ(HAND,WRU),		⊃	HAND/EYE MONITOR DOCUMENTATION - I;
	ZZ(MESSAG,WRU),		⊃	 DITTO - PART II;
	ZZ(MONITR,WRU),		⊃	 DITTO - PART III;
	ZZ(MACROS,NUL),		⊃	LOAD MACROS FOR II SYSTEM;
	ZZ(PURGE,SAI+DMP),	⊃	THIS PROGRAM;
	ZZ(GLORPG,NUL),		⊃	COMPILE FILE FOR ALL HE PROGRAMS;
	ZZ(SAIRPG,NUL),		⊃	COMPILE FILE FOR OTHER SAIL PROGRAMS;
⊃	ZZ(GLBNEW,SEG),		⊃	SAVE SEGMENT FOR II (OBS. ON UDP);
	ZZ(EDGLIB,REL),		⊃	LIBRARY FOR EDGE AND CURVE;
	ZZ(PREMAK,SAI+DMP),	⊃	GENERATES COMMENTLESS PREAMBLE FILE;
⊃	ZZ(CALPLT,SAI+DMP),	⊃	PLOTTER DUMP ROUTINE FOR EDGE POINTS;
⊃	ZZ(PLOTS,FAI+REL),	⊃	SPECIAL SAILABLE CALCOMP ROUTINES (UDP);
	ZZ(CAMDRV,NUL+DMP),	⊃	NEW CAMERA MOVER;
	ZZ(DPYSUB,HDR),		⊃	DISPLAY HEADER FILE;
⊃	ZZ(SQRT,FAI+REL),	⊃	SQUARE ROOT ROUTINE;
	ZZ(SAITRG,NUL+FAI+REL),	⊃	SAIL TRIG FUNCTIONS - HEAD AND TEXT;
⊃	ZZ(HASH,FAI+REL),	⊃	HASH CODER FOR MAKING NEW SEGMENT;
	ZZ(PICTUR,SAI),		⊃	PICTURE INPUT PROGRAM;
	ZZ(SPICT,SAI+DMP),	⊃	STEREO INPUT PROGRAM;
	ZZ(HESLOG,NUL),		⊃	HAND/EYE LOG MESSAGES;
	ZZ(GCREF,FAI+DMP)	⊃	GLOBAL CREF PROGRAM;
⊃	ZZ(MAKSEG,SAI+DMP)	⊃	MAKE A NEW GLOBAL SEGMENT (OBS. ON UDP);
	";
DEFINE FILES="83";	⊃	This is the number of good files;
⊃	Now we use the magic macro to generate our tables;

DEFINE ZZ(A,B)="""A""";
PRELOAD_WITH XX;
SAFE STRING ARRAY GOOD_FILES[1:FILES];
DEFINE ZZ(A,B)="B";
PRELOAD_WITH XX;
SAFE INTEGER ARRAY MORE_EXT[1:FILES];

⊃	This routine is true if one of the common extensions for file
	GOOD_FILE[I] is E;
 
SIMPLE BOOLEAN PROCEDURE EQUEXT(STRING E; INTEGER I);
	BEGIN INTEGER J;
	FOR J ← 0 STEP 1 UNTIL EXT_LENGTH DO
		IF BIT(I, 1 LSH J)∧EQU(COMMON_EXT[J],E) THEN RETURN(TRUE);
	RETURN(FALSE);
	END;

⊃	This is the LPT output routine;

SIMPLE PROCEDURE LPTOUT(REFERENCE STRING FOO);
	OUT(LPT,FOO);

⊃	This is the TTY output routine;


BOOLEAN III;	⊃	TRUE if we are on a display;
INTEGER TTY_OUT;
DEFINE TTY_MAX="25";	⊃	Pause after this many lines if on a dpy;

SIMPLE PROCEDURE TTYOUT(REFERENCE STRING FOO);
	BEGIN
	IF III∧TTY_OUT≥TTY_MAX THEN
		BEGIN
		OUTSTR("TYPE <CR> TO CONTINE");
		INCHWL;
		TTY_OUT ← 0;
		END;
	OUTSTR(FOO);
	TTY_OUT ← TTY_OUT + 1;
	END;

⊃	This is the null output routine;

SIMPLE PROCEDURE NULLOUT(REFERENCE STRING FOO);
	RETURN;
⊃	This routine types the commands;

SIMPLE PROCEDURE COMMANDS;
	BEGIN
	OUTSTR(CRLF&"COMMANDS ARE:"&CRLF);
	OUTSTR("GOOD_FILES→TTY  GOOD_FILES→LPT  BAD_FILES→TTY  BAD_FILES→");
	OUTSTR("LPT   DELETE_BAD_FILES"&CRLF);
	OUTSTR("   1<CR>            2<CR>            3<CR>         4<CR>");
	OUTSTR("          5<CR>"&CRLF);
	END;

⊃	This routine outputs the list of good files;

SIMPLE PROCEDURE OUT_GOOD(PROCEDURE DEVICE);
	BEGIN STRING FOO,Z;
	INTEGER I, J;
	DEVICE(Z←"GOOD FILES ARE:"&CRLF);
	FOR I ← 1 STEP 1 UNTIL FILES DO
		BEGIN
		FOO ← GOOD_FILES[I];
		IF MORE_EXT[I] THEN FOR J←0 STEP 1 UNTIL EXT_LENGTH DO
			IF BIT(I,1 LSH J)∧J≠NULLIND THEN
			FOO←FOO&"."&COMMON_EXT[J]&"	";
		DEVICE(Z←FOO&CRLF);
		END;
	DEVICE(Z←CRLF);
	END;

BOOLEAN BADFLG;	⊃	TRUE if OUT_BAD called;
BOOLEAN ARRAY BAD_FLAGS[1:1000];
⊃	This routine outputs the illegal file names.
	It also generates a table of flags indicating the illegal files;

SIMPLE PROCEDURE OUT_BAD(PROCEDURE DEVICE);
	BEGIN STRING E, F, FOO, Z;
	INTEGER I, J, COUNT;
	BADFLG ← TRUE;
	DEVICE(Z←"ILLEGAL FILES ARE:"&CRLF);
	COUNT ← 0;
	FOO ← NULL;
	FOR I ← 1 STEP 1 UNTIL UFDLENGTH DO
		BEGIN
		F ← UFD_FILE[I];
		E ← UFD_EXT[I];
		FOR J←1 STEP 1 UNTIL FILES DO
			IF EQU(F,GOOD_FILES[J])∧EQUEXT(E,J) THEN DONE;
		IF BAD_FLAGS[I] ← J>FILES THEN
			BEGIN
			IF COUNT≥4 THEN
				BEGIN
				DEVICE(Z←FOO&CRLF);
				FOO ← NULL;
				COUNT ← 0;
				END;
			FOO ← FOO&((F&(IF LENGTH(E) THEN "."&E ELSE "")&
				"            ")[1 FOR 12]);
			COUNT ← COUNT+1;
			END;
		END;
	DEVICE(Z←FOO&CRLF&CRLF);
	END;

⊃	This routine deletes illegal files;

SIMPLE PROCEDURE DELETEX;
	BEGIN BOOLEAN FLAG;
	STRING E, F;
	INTEGER I;
	IF ¬BADFLG THEN OUT_BAD(NULLOUT);
	FOR I←1 STEP 1 UNTIL UFDLENGTH DO IF BAD_FLAGS[I] THEN
		BEGIN
		F ← UFD_FILE[I];
		E ← UFD_EXT[I];
		F ← F&(IF E THEN "."&E ELSE "");
		LOOKUP(DSK,F,FLAG);
		IF ¬FLAG THEN RENAME(DSK,"",0,FLAG);
		OUTSTR(F&(IF FLAG THEN " NOT" ELSE "")&" DELETED"&CRLF);
		BAD_FLAGS[I] ← FALSE;
		END;
	UFDREAD; ⊃	Read new list of files;
	END;
⊃	Now we get down to business;

INTEGER COM, EOF;
LABEL LOOP;

	BADFLG ← FALSE;
	UFDREAD;
	COMMANDS;
	START_CODE DEFINE TTYUUO="'51000000000";
		SETOM 1;
		TTYUUO 6,1;
		SETZM III;
		TLNE 1,'420000;
		SETOM III;
		END;
LOOP:	OUTSTR(CRLF&"COMMAND IS ");
	COM ← CVD(INCHWL);
	IF COM LAND 1 THEN TTY_OUT←0 ELSE OPEN(LPT,"LPT",0,0,2,128,EOF,EOF);
	CASE COM-1 OF
		BEGIN
		OUT_GOOD(TTYOUT);
		OUT_GOOD(LPTOUT);
		OUT_BAD(TTYOUT);
		OUT_BAD(LPTOUT);
		BEGIN
		IF ¬BADFLG THEN
			BEGIN
			OUTSTR("WANT A LIST OF ILLEGAL FILES FIRST?"&CRLF);
			IF INCHWL≠"N" THEN GO TO LOOP;
			END;
		DELETEX;
		END;
		END;
	IF ¬(COM LAND 1) THEN RELEASE(LPT);
	IF III THEN COMMANDS;
	GO TO LOOP;
	END;